Latest Date of Dataset: 2020-04-28
Updated: 2020-04-29 17:38:04 EST
This dashboard is used to track the current progress of the COVID-19 pandemic throughout the world. The visualization and information presented are automatically updated daily with current data scraped from the Johns Hopkin’s COVID-19 Data Repository. Their data is retrieved from offical sources such as World Health Organization (WHO), China CDC, US CDC, and more.
The data is cleaned and aggregated through R, formatted in Rmarkdown, and exported as an HTML document to be hosted through GitPages. The source R notebook can be found at covid19-daily-dashboard.Rmd in the GitHub repository.
Overview of Cases (2020-04-28)
Below is an interactive plot displaying the number of confirmed, dead, and recovered cases per country and province if data is specified. The data was aggregated from the Johns Hopkins’s data repository and this notebook is set to run nightly to provide up to date results
Confirmed Cases per Country
The table below shows aggregated data of each country’s confirmed, recovered, and dead population. Each column can be sorted to view least or most of each status. The graphs below show the total and daily count of confirmed cases for the countries with the most cases and are tracked by days since the first reported case. Each graph has two seperate views - one with total count and another with % of country’s population. The population data is retrived from the United Nations.
(*China’s data is removed since dataset does not track prior to 22Jan20 therefore does not align with other countries)
cv_latest <- filter(cv_merge, Date == latest_date)
cv_latest <- cv_latest[with(cv_latest, order(-Confirmed, -Recovered, -Dead)), ]
COVID19 Cases Spread Timelapse
The time-lapse was produced through gganimate and shows the spread of the virus since 22Jan2020. The time-lapse cycles through the dates, showing the color coded increase of confirmed, recovered, and death cases across the world.

New Cases of the Day (2020-04-28)
The ‘New Cases of the Day’ map displays all confirmed cases of the specified date. The map was produced through Leaflet and provides a detailed and interactive map that shows the location and number of cases of the day.
Also, to differentiate if the case of the day is the first case in the specified location, it is highlighted red. All the specified points on the map are listed in the table below, including cumulative count of each location.
New Cases of the Week (2020-04-28)
The ‘New Cases of the Week’ map displays all confirmed cases of the week starting from the specified date. This map shows the same information as the daily cases map but includes all cases in the past week.
General Trends
The plots below outlines general trends seen of the virus over time:
“Percent of Cases Recovered or Dead per Day”: the total percent of cases that have resulted in recovery or death per confirmed case
“Cumulative Status of All Cases”: the continuous increase of confirmed, death, and recovered cases over time
“Status of Cases per Day”: the number of cases classified as confirmed, death, or recovered subtracted to show per day changes



LS0tDQp0aXRsZTogIkNPVklEMTkgRGFpbHkgRGFzaGJvYXJkIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQogICAgDQotLS0NCg0KYGBge3IgU2V0dXAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIEludGVyYWN0aW9uDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShyc3R1ZGlvYXBpKQ0KbGlicmFyeShkcmF0KQ0KbGlicmFyeShnaXQycikNCg0KIyBBZ2dyZWdhdGlvbg0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCg0KIyBWaXN1YWxpemF0aW9ucw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeShwbmcpDQpsaWJyYXJ5KGdpZnNraSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShyYW5kb21jb2xvUikNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmxpbmsgPC0gImh0dHBzOi8vZ2l0aHViLmNvbS8vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvcmF3L21hc3Rlci9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy8iDQpjc3ZfbGlzdCA8LSBjKA0KICAidGltZV9zZXJpZXNfY292aWQxOV9jb25maXJtZWRfZ2xvYmFsLmNzdiIsDQogICJ0aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2IiwNCiAgInRpbWVfc2VyaWVzX2NvdmlkMTlfcmVjb3ZlcmVkX2dsb2JhbC5jc3YiDQopDQoNCg0KZm9yIChjc3YgaW4gY3N2X2xpc3QpIHsNCiAgcGF0aCA8LSBwYXN0ZShsaW5rLCBjc3YsIHNlcCA9ICIiKQ0KICBkb3dubG9hZF9wYXRoIDwtIHBhc3RlKCJkYXRhX3Jhdy8iLCBjc3YsIHNlcCA9ICIiKQ0KICBkb3dubG9hZC5maWxlKHBhdGgsIGRlc3RmaWxlID0gZG93bmxvYWRfcGF0aCkNCn0NCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmN2X2NvbiA8LSByZWFkX2NzdigiZGF0YV9yYXcvdGltZV9zZXJpZXNfY292aWQxOV9jb25maXJtZWRfZ2xvYmFsLmNzdiIpICU+JQ0KICBnYXRoZXIoa2V5ID0gIkRhdGUiLCB2YWx1ZSA9IENvbmZpcm1lZCwgLUxhdCwgLUxvbmcsIC1gUHJvdmluY2UvU3RhdGVgLCAtYENvdW50cnkvUmVnaW9uYCkNCg0KY3ZfZGVkIDwtIHJlYWRfY3N2KCJkYXRhX3Jhdy90aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2IikgJT4lDQogIGdhdGhlcihrZXkgPSAiRGF0ZSIsIHZhbHVlID0gRGVhZCwgLUxhdCwgLUxvbmcsIC1gUHJvdmluY2UvU3RhdGVgLCAtYENvdW50cnkvUmVnaW9uYCkNCg0KY3ZfcmVjIDwtIHJlYWRfY3N2KCJkYXRhX3Jhdy90aW1lX3Nlcmllc19jb3ZpZDE5X3JlY292ZXJlZF9nbG9iYWwuY3N2IikgJT4lDQogIGdhdGhlcihrZXkgPSAiRGF0ZSIsIHZhbHVlID0gUmVjb3ZlcmVkLCAtTGF0LCAtTG9uZywgLWBQcm92aW5jZS9TdGF0ZWAsIC1gQ291bnRyeS9SZWdpb25gKQ0KDQpjb3VudHJ5X3BvcCA8LSByZWFkX2NzdigiZGF0YV9yYXcvY291bnRyeV9wb3B1bGF0aW9uLmNzdiIpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmN2X21lcmdlIDwtIG1lcmdlKGN2X2NvbiwgY3ZfZGVkLCBieSA9IGMoIlByb3ZpbmNlL1N0YXRlIiwgIkxhdCIsICJMb25nIiwgIkNvdW50cnkvUmVnaW9uIiwgIkRhdGUiKSwgYWxsID0gVFJVRSkgJT4lDQogIG1lcmdlKGN2X3JlYywgYnkgPSBjKCJQcm92aW5jZS9TdGF0ZSIsICJMYXQiLCAiTG9uZyIsICJDb3VudHJ5L1JlZ2lvbiIsICJEYXRlIiksIGFsbCA9IFRSVUUpICU+JQ0KICByZW5hbWUoIkNvdW50cnlfUmVnaW9uIiA9ICJDb3VudHJ5L1JlZ2lvbiIpICU+JQ0KICByZW5hbWUoIlByb3ZpbmNlX1N0YXRlIiA9ICJQcm92aW5jZS9TdGF0ZSIpDQpjdl9tZXJnZSREYXRlIDwtIGFzLkRhdGUoY3ZfbWVyZ2UkRGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyV5IikNCg0KY3YgPC0gZ2F0aGVyKGN2X21lcmdlLCBrZXkgPSAiU3RhdHVzIiwgdmFsdWUgPSBDb3VudCwgLURhdGUsIC1MYXQsIC1Mb25nLCAtUHJvdmluY2VfU3RhdGUsIC1Db3VudHJ5X1JlZ2lvbikNCmN2IDwtIGN2W3dpdGgoY3YsIG9yZGVyKENvdW50cnlfUmVnaW9uLCBQcm92aW5jZV9TdGF0ZSwgU3RhdHVzLCBEYXRlKSksIF0NCmBgYA0KDQoNCg0KYGBge3IgZnVuY3Rpb25fY2hlY2tfZmlyc3RfY2FzZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNoZWNrX2NvbnRpbnVvdXMgPC0gZnVuY3Rpb24oeCwgY3YsIG51bV9wcmV2KSB7DQogIGlmICgNCiAgICAoY3YkTG9uZ1t4XSAhPSBjdiRMb25nW3ggLSBudW1fcHJldl0pIHx8DQogICAgICAoY3YkTGF0W3hdICE9IGN2JExhdFt4IC0gbnVtX3ByZXZdKSB8fA0KICAgICAgKGN2JFN0YXR1c1t4XSAhPSBjdiRTdGF0dXNbeCAtIG51bV9wcmV2XSkpIHsNCiAgICBjb250IDwtICJOIg0KICB9DQogIGVsc2Ugew0KICAgIGNvbnQgPC0gIlkiDQogIH0NCiAgcmV0dXJuKGNvbnQpDQp9DQoNCg0KZGFpbHlfd2Vla2x5X2NvdW50ZXIgPC0gZnVuY3Rpb24oY3YpIHsNCiAgZm9yICh4IGluIHNlcSgxLCBucm93KGN2KSkpIHsNCiAgICBpZiAoeCA9PSAxKSB7DQogICAgICBjdiREYWlseV9Db3VudFt4XSA8LSBOQQ0KICAgICAgY3YkV2Vla2x5X0NvdW50W3hdIDwtIE5BDQogICAgfQ0KICAgIGVsc2UgaWYgKGNoZWNrX2NvbnRpbnVvdXMoeCwgY3YsIDEpID09ICJOIikgew0KICAgICAgY3YkRGFpbHlfQ291bnRbeF0gPC0gTkENCiAgICAgIGN2JFdlZWtseV9Db3VudFt4XSA8LSBOQQ0KICAgIH0NCiAgICBlbHNlIGlmICh4IDw9IDcpIHsNCiAgICAgIGN2JERhaWx5X0NvdW50W3hdIDwtIChjdiRDb3VudFt4XSkgLSAoY3YkQ291bnRbeCAtIDFdKQ0KICAgICAgY3YkV2Vla2x5X0NvdW50W3hdIDwtIE5BDQogICAgfQ0KICAgIGVsc2UgaWYgKChjaGVja19jb250aW51b3VzKHgsIGN2LCAxKSA9PSAiWSIpICYmDQogICAgICAoY2hlY2tfY29udGludW91cyh4LCBjdiwgNykgPT0gIk4iKSkgew0KICAgICAgY3YkRGFpbHlfQ291bnRbeF0gPC0gKGN2JENvdW50W3hdKSAtIChjdiRDb3VudFt4IC0gMV0pDQogICAgICBjdiRXZWVrbHlfQ291bnRbeF0gPC0gTkENCiAgICB9DQogICAgZWxzZSBpZiAoKGNoZWNrX2NvbnRpbnVvdXMoeCwgY3YsIDcpID09ICJZIikpIHsNCiAgICAgIGN2JERhaWx5X0NvdW50W3hdIDwtIChjdiRDb3VudFt4XSkgLSAoY3YkQ291bnRbeCAtIDFdKQ0KICAgICAgY3YkV2Vla2x5X0NvdW50W3hdIDwtIChjdiRDb3VudFt4XSkgLSAoY3YkQ291bnRbeCAtIDddKQ0KICAgIH0NCiAgfQ0KICByZXR1cm4oY3YpDQp9DQpgYGANCg0KDQpgYGB7ciwgYXBwbHlfY2hlY2tfY2FzZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmN2IDwtIGRhaWx5X3dlZWtseV9jb3VudGVyKGN2KQ0KbGF0ZXN0X2RhdGUgPC0gYXMuRGF0ZShTeXMuRGF0ZSgpKSAtIDENCiNsYXRlc3RfZGF0ZSA8LSBzb3J0KGN2JERhdGUsIGRlY3JlYXNpbmcgPSBUUlVFKVsxXSAtIDENCmN2IDwtIGZpbHRlcihjdiwgRGF0ZSA8PSBsYXRlc3RfZGF0ZSkNCmBgYA0KDQojIyMjIyBMYXRlc3QgRGF0ZSBvZiBEYXRhc2V0OiBgciBsYXRlc3RfZGF0ZWANCiMjIyMjIyBVcGRhdGVkOiBgciBTeXMudGltZSgpYCBFU1QNCg0KVGhpcyBkYXNoYm9hcmQgaXMgdXNlZCB0byB0cmFjayB0aGUgY3VycmVudCBwcm9ncmVzcyBvZiB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgdGhyb3VnaG91dCB0aGUgd29ybGQuIFRoZSB2aXN1YWxpemF0aW9uIGFuZCBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgYXJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBkYWlseSB3aXRoIGN1cnJlbnQgZGF0YSBzY3JhcGVkIGZyb20gdGhlIFtKb2hucyBIb3BraW7igJlzIENPVklELTE5IERhdGEgUmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5KS4gVGhlaXIgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSBvZmZpY2FsIHNvdXJjZXMgc3VjaCBhcyBXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIChXSE8pLCBDaGluYSBDREMsIFVTIENEQywgYW5kIG1vcmUuDQoNClRoZSBkYXRhIGlzIGNsZWFuZWQgYW5kIGFnZ3JlZ2F0ZWQgdGhyb3VnaCBSLCBmb3JtYXR0ZWQgaW4gUm1hcmtkb3duLCBhbmQgZXhwb3J0ZWQgYXMgYW4gSFRNTCBkb2N1bWVudCB0byBiZSBob3N0ZWQgdGhyb3VnaCBHaXRQYWdlcy4gVGhlIHNvdXJjZSBSIG5vdGVib29rIGNhbiBiZSBmb3VuZCBhdCBbY292aWQxOS1kYWlseS1kYXNoYm9hcmQuUm1kXShodHRwczovL2dpdGh1Yi5jb20vYWxiZWNoZW4vY292aWQxOS1kYWlseS1kYXNoYm9hcmQvYmxvYi9tYXN0ZXIvY292aWQxOS1kYWlseS1kYXNoYm9hcmQuUm1kKSBpbiB0aGUgW0dpdEh1YiByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vYWxiZWNoZW4vY292aWQxOS1kYWlseS1kYXNoYm9hcmQpLg0KDQoNCmBgYHtyIGVtcHR5X2RmX2Z1bmN0aW9uLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZW1wdHlfZGYgPC0gZnVuY3Rpb24oKSB7DQogIGVtcHR5X2RmIDwtIGRhdGEuZnJhbWUoDQogICAgUHJvdmluY2VfU3RhdGUgPSBjaGFyYWN0ZXIoMCksDQogICAgTGF0ID0gZG91YmxlKCksIExvbmcgPSBkb3VibGUoKSwNCiAgICBDb3VudHJ5X1JlZ2lvbiA9IGNoYXJhY3RlcigwKSwNCiAgICBEYXRlID0gYXMuRGF0ZShjaGFyYWN0ZXIoKSksDQogICAgU3RhdHVzID0gY2hhcmFjdGVyKDApLA0KICAgIENvdW50ID0gZG91YmxlKCksDQogICAgRGFpbHlfQ291bnQgPSBkb3VibGUoKSwgV2Vla2x5X0NvdW50ID0gZG91YmxlKCkNCiAgKQ0KICBlbXB0eV9kZiRQcm92aW5jZV9TdGF0ZSA8LSBhcy5jaGFyYWN0ZXIoZW1wdHlfZGYkUHJvdmluY2VfU3RhdGUpDQogIGVtcHR5X2RmJENvdW50cnlfUmVnaW9uIDwtIGFzLmNoYXJhY3RlcihlbXB0eV9kZiRDb3VudHJ5X1JlZ2lvbikNCiAgZW1wdHlfZGYkU3RhdHVzIDwtIGFzLmNoYXJhY3RlcihlbXB0eV9kZiRTdGF0dXMpDQogIHJldHVybihlbXB0eV9kZikNCn0NCmBgYA0KDQoNCmBgYHtyIG5ld19jYXNlc19hZ2csIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpmaXJzdF9hbmRfbmV3X2Nhc2VzIDwtIGZ1bmN0aW9uKGN2LCBkYXlzKSB7DQogIGhpZ2hfZGF0ZSA8LSBzb3J0KGN2JERhdGUsIGRlY3JlYXNpbmcgPSBUUlVFKVsxXSAtIDENCiAgY3YgPC0gY3YgJT4lIA0KICAgIGZpbHRlcihTdGF0dXMgPT0gIkNvbmZpcm1lZCIsICFpcy5uYShDb3VudCkpDQogIGN2JEZpcnN0X0Nhc2UgPC0gRkFMU0UNCg0KICBmb3IgKHggaW4gc2VxKDEsIG5yb3coY3YpKSkgew0KICAgIGlmICgNCiAgICAgIChjdiREYXRlW3hdID09IGhpZ2hfZGF0ZSkgJiYNCiAgICAgICAgKGN2JENvdW50W3ggLSBkYXlzXSA9PSAwKSAmJg0KICAgICAgICAoY3YkQ291bnRbeF0gPiAwKQ0KICAgICkgew0KICAgICAgY3YkRmlyc3RfQ2FzZVt4XSA8LSBUUlVFDQogICAgfQ0KICB9DQoNCiAgbmV3X2Nhc2VzX2RmIDwtIGZpbHRlcihjdiwgRGF0ZSA9PSBoaWdoX2RhdGUpDQoNCiAgaWYgKGRheXMgPT0gMSkgew0KICAgIG5ld19jYXNlc19kZiA8LSBmaWx0ZXIobmV3X2Nhc2VzX2RmLCBEYWlseV9Db3VudCA+IDApDQogIH0NCiAgZWxzZSBpZiAoZGF5cyA9PSA3KSB7DQogICAgbmV3X2Nhc2VzX2RmIDwtIGZpbHRlcihuZXdfY2FzZXNfZGYsIFdlZWtseV9Db3VudCA+IDApDQogIH0NCg0KICByZXR1cm4obmV3X2Nhc2VzX2RmKQ0KfQ0KDQpuZXdfY2FzZXNfZGF5IDwtIGZpcnN0X2FuZF9uZXdfY2FzZXMoY3YsIDEpDQpuZXdfY2FzZXNfd2VlayA8LSBmaXJzdF9hbmRfbmV3X2Nhc2VzKGN2LCA3KQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpjdl9sYXRlc3QgPC0gZmlsdGVyKGN2X21lcmdlLCBEYXRlID09IGxhdGVzdF9kYXRlKQ0KY3ZfbGF0ZXN0IDwtIGN2X2xhdGVzdFt3aXRoKGN2X2xhdGVzdCwgb3JkZXIoLUNvbmZpcm1lZCwgLVJlY292ZXJlZCwgLURlYWQpKSwgXQ0KYGBgDQoNCiMjIyBPdmVydmlldyBvZiBDYXNlcyAoYHIgbGF0ZXN0X2RhdGVgKQ0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgcGxvdCBkaXNwbGF5aW5nIHRoZSBudW1iZXIgb2YgY29uZmlybWVkLCBkZWFkLCBhbmQgcmVjb3ZlcmVkIGNhc2VzIHBlciBjb3VudHJ5IGFuZCBwcm92aW5jZSBpZiBkYXRhIGlzIHNwZWNpZmllZC4gVGhlIGRhdGEgd2FzIGFnZ3JlZ2F0ZWQgZnJvbSB0aGUgSm9obnMgSG9wa2lucydzIGRhdGEgcmVwb3NpdG9yeSBhbmQgdGhpcyBub3RlYm9vayBpcyBzZXQgdG8gcnVuIG5pZ2h0bHkgdG8gcHJvdmlkZSB1cCB0byBkYXRlIHJlc3VsdHMNCmBgYHtyIGZ1bGxfcGxvdCwgZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY3ZfbGF0ZXN0X2xhYmVscyA8LSBmdW5jdGlvbihkZikgew0KICBsYWJzIDwtIGxhcHBseShzZXEobnJvdyhkZikpLCBmdW5jdGlvbihpKSB7DQogICAgcGFzdGUwKA0KICAgICAgIkNvdW50cnk6ICIsIGRmW2ksICJDb3VudHJ5X1JlZ2lvbiJdLCAiPGJyPiAiLA0KICAgICAgIlByb3ZpbmNlOiAiLCBkZltpLCAiUHJvdmluY2VfU3RhdGUiXSwgIjxicj4iLA0KICAgICAgIkNvbmZpcm1lZDogIiwgZGZbaSwgIkNvbmZpcm1lZCJdLCAiPGJyPiIsDQogICAgICAiRGVhZDogIiwgZGZbaSwgIkRlYWQiXSwgIjxicj4iLA0KICAgICAgIlJlY292ZXJlZDogIiwgZGZbaSwgIlJlY292ZXJlZCJdLCAiPGJyPiIsDQogICAgICAiRGF0ZTogIiwgZGZbaSwgIkRhdGUiXQ0KICAgICkNCiAgfSkNCn0NCg0KbGVhZmxldChkYXRhID0gY3ZfbGF0ZXN0LCB3aWR0aCA9ICIxMDAlIikgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgbGF0ID0gfkxhdCwNCiAgICBsbmcgPSB+TG9uZywNCiAgICByYWRpdXMgPSB+IGxvZyhDb25maXJtZWQsIDEuMSkvMTAsDQogICAgbGFiZWwgPSBsYXBwbHkoY3ZfbGF0ZXN0X2xhYmVscyhjdl9sYXRlc3QpLCBodG1sdG9vbHM6OkhUTUwpDQogICkNCmBgYA0KDQoNCiMjIyBDb25maXJtZWQgQ2FzZXMgcGVyIENvdW50cnkNClRoZSB0YWJsZSBiZWxvdyBzaG93cyBhZ2dyZWdhdGVkIGRhdGEgb2YgZWFjaCBjb3VudHJ5J3MgY29uZmlybWVkLCByZWNvdmVyZWQsIGFuZCBkZWFkIHBvcHVsYXRpb24uIEVhY2ggY29sdW1uIGNhbiBiZSBzb3J0ZWQgdG8gdmlldyBsZWFzdCBvciBtb3N0IG9mIGVhY2ggc3RhdHVzLiBUaGUgZ3JhcGhzIGJlbG93IHNob3cgdGhlIHRvdGFsIGFuZCBkYWlseSBjb3VudCBvZiBjb25maXJtZWQgY2FzZXMgZm9yIHRoZSBjb3VudHJpZXMgd2l0aCB0aGUgbW9zdCBjYXNlcyBhbmQgYXJlIHRyYWNrZWQgYnkgZGF5cyBzaW5jZSB0aGUgZmlyc3QgcmVwb3J0ZWQgY2FzZS4gRWFjaCBncmFwaCBoYXMgdHdvIHNlcGVyYXRlIHZpZXdzIC0gb25lIHdpdGggdG90YWwgY291bnQgYW5kIGFub3RoZXIgd2l0aCAlIG9mIGNvdW50cnkncyBwb3B1bGF0aW9uLiBUaGUgcG9wdWxhdGlvbiBkYXRhIGlzIHJldHJpdmVkIGZyb20gdGhlIFtVbml0ZWQgTmF0aW9uc10oaHR0cHM6Ly9wb3B1bGF0aW9uLnVuLm9yZy93cHAvRG93bmxvYWQvU3RhbmRhcmQvQ1NWLykuDQoNCg0KDQooKkNoaW5hJ3MgZGF0YSBpcyByZW1vdmVkIHNpbmNlIGRhdGFzZXQgZG9lcyBub3QgdHJhY2sgcHJpb3IgdG8gMjJKYW4yMCB0aGVyZWZvcmUgZG9lcyBub3QgYWxpZ24gd2l0aCBvdGhlciBjb3VudHJpZXMpDQoNCg0KYGBge3IgY291bnRyeV90YWJsZSwgZWNobz1GQUxTRX0NCmNvdW50cnlfdGFibGUgPC0gY3ZfbWVyZ2UgJT4lDQogIHNlbGVjdChDb3VudHJ5X1JlZ2lvbiwgQ29uZmlybWVkLCBSZWNvdmVyZWQsIERlYWQsIERhdGUpICU+JQ0KICBncm91cF9ieShDb3VudHJ5X1JlZ2lvbikgJT4lDQogIGZpbHRlcihEYXRlPT1sYXRlc3RfZGF0ZSkgJT4lDQogIHNlbGVjdChDb3VudHJ5X1JlZ2lvbiwgQ29uZmlybWVkLCBSZWNvdmVyZWQsIERlYWQpICU+JQ0KICBzdW1tYXJpc2VfYWxsKHN1bSkNCmNvdW50cnlfdGFibGUgPC0gY291bnRyeV90YWJsZVt3aXRoKGNvdW50cnlfdGFibGUsIG9yZGVyKC1Db25maXJtZWQsIC1SZWNvdmVyZWQsIC1EZWFkKSksIF0NCg0KY291bnRyeV90YWJsZQ0KYGBgDQoNCmBgYHtyIGRmX2Zvcl90b3BfY291bnRyaWVzLCBlY2hvPUZBTFNFfQ0KdG9wXzEwX2NvdW50cmllcyA8LSAoaGVhZChjb3VudHJ5X3RhYmxlJENvdW50cnlfUmVnaW9uLCAxMSkpDQp0b3BfMTBfY291bnRyaWVzIDwtIHRvcF8xMF9jb3VudHJpZXNbdG9wXzEwX2NvdW50cmllcyAhPSAiUnVzc2lhIl0NCnRvcF8xMF9jb3VudHJpZXMgPC0gdG9wXzEwX2NvdW50cmllc1t0b3BfMTBfY291bnRyaWVzICE9ICJDaGluYSJdDQoNCnRvcDEwX2RmIDwtIGN2ICU+JQ0KICBmaWx0ZXIoKGN2JENvdW50cnlfUmVnaW9uICVpbiUgYyh0b3BfMTBfY291bnRyaWVzKSkgJiAoY3YkU3RhdHVzID09ICdDb25maXJtZWQnKSkgJT4lDQogIHNlbGVjdChDb3VudHJ5X1JlZ2lvbiwgRGF0ZSwgQ291bnQsIERhaWx5X0NvdW50LCBXZWVrbHlfQ291bnQpICU+JQ0KICBncm91cF9ieShDb3VudHJ5X1JlZ2lvbiwgRGF0ZSkgJT4lDQogIHN1bW1hcmlzZShDb3VudCA9IHN1bShDb3VudCwgbmEucm0gPSBUUlVFKSwgRGFpbHlfQ291bnQgPSBzdW0oRGFpbHlfQ291bnQsIG5hLnJtID0gVFJVRSksIFdlZWtseV9Db3VudCA9IHN1bShXZWVrbHlfQ291bnQsIG5hLnJtID0gVFJVRSkpDQoNCg0KdG9wMTBfZGYgPC0gdG9wMTBfZGZbd2l0aCh0b3AxMF9kZiwgb3JkZXIoQ291bnRyeV9SZWdpb24sIERhdGUpKSwgXQ0KdG9wMTBfZGYkYERheXMgU2luY2UgRmlyc3QgQ2FzZWAgPC0gMA0KDQpmb3IgKHggaW4gc2VxKDIsIG5yb3codG9wMTBfZGYpKSkgew0KICBpZiAoKHRvcDEwX2RmJENvdW50cnlfUmVnaW9uW3hdID09IHRvcDEwX2RmJENvdW50cnlfUmVnaW9uW3gtMV0pICYgKHRvcDEwX2RmJENvdW50W3hdID49IDI1KSkgew0KICAgIGlmICh0b3AxMF9kZiRgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYFt4LTFdID09IDApew0KICAgICAgaWYgKHRvcDEwX2RmJERhaWx5X0NvdW50W3hdID4gMCkgew0KICAgICAgICB0b3AxMF9kZiRgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYFt4XSA8LSAxDQogICAgICB9DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgaW50ZXJ2YWwgPC0gdG9wMTBfZGYkYERheXMgU2luY2UgRmlyc3QgQ2FzZWBbeC0xXQ0KICAgICAgdG9wMTBfZGYkYERheXMgU2luY2UgRmlyc3QgQ2FzZWBbeF0gPC0gMSArIGludGVydmFsDQogICAgfQ0KICB9DQp9DQoNCg0KdG9wMTBfZGYgPC0gbWVyZ2UodG9wMTBfZGYsY291bnRyeV9wb3AsYnk9YygnQ291bnRyeV9SZWdpb24nLCdDb3VudHJ5X1JlZ2lvbicpKQ0KdG9wMTBfZGYkUF9Db3VudCA8LSB0b3AxMF9kZiRDb3VudCAvIHRvcDEwX2RmJFBvcHVsYXRpb24NCnRvcDEwX2RmJFBfRGFpbHlfQ291bnQgPC0gdG9wMTBfZGYkRGFpbHlfQ291bnQgLyB0b3AxMF9kZiRQb3B1bGF0aW9uDQp0b3AxMF9kZiRQX1dlZWtseV9Db3VudCA8LSB0b3AxMF9kZiRXZWVrbHlfQ291bnQgLyB0b3AxMF9kZiRQb3B1bGF0aW9uDQp0b3AxMF9kZiA8LSB0b3AxMF9kZiAlPiUgc2VsZWN0KENvdW50cnlfUmVnaW9uLCBEYXRlLCBDb3VudCwgIFBfQ291bnQsIERhaWx5X0NvdW50LCBQX0RhaWx5X0NvdW50LCBXZWVrbHlfQ291bnQsIFBfV2Vla2x5X0NvdW50LCBgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCkNCnRvcDEwX2RmIDwtIHRvcDEwX2RmW3dpdGgodG9wMTBfZGYsIG9yZGVyKENvdW50cnlfUmVnaW9uLCBEYXRlKSksIF0NCg0KYGBgDQoNCmBgYHtyfQ0KdG9wXzEwX2NvdW50cmllcw0KYGBgDQoNCg0KYGBge3IgdG90YWxfcGxvdGx5LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0NCnRvcDEwX2RmX3dpZGVfcF9jb3VudCA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIFBfQ291bnQsIGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgKSAlPiUNCiAgc3ByZWFkKGtleT1Db3VudHJ5X1JlZ2lvbiwgdmFsdWU9UF9Db3VudCkNCg0KdG9wMTBfZGZfd2lkZV9jb3VudCA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIENvdW50LCBgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCkgJT4lDQogIHNwcmVhZChrZXk9Q291bnRyeV9SZWdpb24sIHZhbHVlPUNvdW50KQ0KDQoNCmZpZyA8LSB0b3AxMF9kZl93aWRlX2NvdW50ICU+JSBwbG90X2x5KCkNCg0KZm9yIChrIGluIDI6bGVuZ3RoKHRvcF8xMF9jb3VudHJpZXMpKSB7DQogIGNvdW50cnlfZGYgPC0gZGF0YS5mcmFtZSh5PXRvcDEwX2RmX3dpZGVfY291bnRbW2tdXSwgeD10b3AxMF9kZl93aWRlX2NvdW50W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPWNvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX2NvdW50KVtrXSwgdmlzaWJsZSA9IEYpDQogIA0KICBwX2NvdW50cnlfZGYgPC0gZGF0YS5mcmFtZSh5PXRvcDEwX2RmX3dpZGVfcF9jb3VudFtba11dLCB4PXRvcDEwX2RmX3dpZGVfcF9jb3VudFtbMV1dKQ0KICBmaWcgPC0gYWRkX3RyYWNlKGZpZywgeT1+eSwgeD1+eCwgZGF0YT1wX2NvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX3BfY291bnQpW2tdKQ0KfQ0KDQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoDQogICAgdGl0bGUgPSAiVG90YWwgQ29uZmlybWVkIENhc2VzIFNpbmNlIEZpcnN0IDI1IENhc2VzIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGU9J0RheXMgU2luY2UgRmlyc3QgMjUgQ2FzZXMnKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVG90YWwgQ291bnQgKCUgb3IgIykiKSwNCiAgICB1cGRhdGVtZW51cyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB5ID0gMC44LA0KICAgICAgICBidXR0b25zID0gbGlzdCgNCg0KICAgICAgICAgIGxpc3QobWV0aG9kID0gInJlc3R5bGUiLA0KICAgICAgICAgICAgICAgYXJncyA9IGxpc3QoInZpc2libGUiLCBjKHJlcChsaXN0KEZBTFNFLCBUUlVFKSwgMTUpKSksDQogICAgICAgICAgICAgICBsYWJlbCA9ICJQZXJjZW50IENvdW50IiksDQoNCiAgICAgICAgICBsaXN0KG1ldGhvZCA9ICJyZXN0eWxlIiwNCiAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KCJ2aXNpYmxlIiwgYyhyZXAobGlzdChUUlVFLCBGQUxTRSksIDE1KSkpLA0KICAgICAgICAgICAgICAgbGFiZWwgPSAiVG90YWwgQ291bnQiKQ0KICAgICAgICApDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQoNCmZpZw0KYGBgDQoNCmBgYHtyIHdlZWtseV9wbG90bHksIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQ0KdG9wMTBfZGZfd2lkZV9wX3dlZWtseSA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIFBfV2Vla2x5X0NvdW50LCBgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCkgJT4lDQogIHNwcmVhZChrZXk9Q291bnRyeV9SZWdpb24sIHZhbHVlPVBfV2Vla2x5X0NvdW50KQ0KDQp0b3AxMF9kZl93aWRlX3dlZWtseSA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIFdlZWtseV9Db3VudCwgYERheXMgU2luY2UgRmlyc3QgQ2FzZWApICU+JQ0KICBzcHJlYWQoa2V5PUNvdW50cnlfUmVnaW9uLCB2YWx1ZT1XZWVrbHlfQ291bnQpDQoNCmZpZyA8LSB0b3AxMF9kZl93aWRlX3dlZWtseSAlPiUgcGxvdF9seSgpDQoNCmZvciAoayBpbiAyOmxlbmd0aCh0b3BfMTBfY291bnRyaWVzKSkgew0KICBjb3VudHJ5X2RmIDwtIGRhdGEuZnJhbWUoeT10b3AxMF9kZl93aWRlX3dlZWtseVtba11dLCB4PXRvcDEwX2RmX3dpZGVfd2Vla2x5W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPWNvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX3dlZWtseSlba10sIHZpc2libGUgPSBGKQ0KICANCiAgcF9jb3VudHJ5X2RmIDwtIGRhdGEuZnJhbWUoeT10b3AxMF9kZl93aWRlX3Bfd2Vla2x5W1trXV0sIHg9dG9wMTBfZGZfd2lkZV9wX3dlZWtseVtbMV1dKQ0KICBmaWcgPC0gYWRkX3RyYWNlKGZpZywgeT1+eSwgeD1+eCwgZGF0YT1wX2NvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX3Bfd2Vla2x5KVtrXSkNCn0NCg0KZmlnIDwtIGZpZyAlPiUgbGF5b3V0KA0KICAgIHRpdGxlID0gIldlZWtseSBDb25maXJtZWQgQ2FzZXMgU2luY2UgRmlyc3QgMjUgQ2FzZXMiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZT0nRGF5cyBTaW5jZSBGaXJzdCAyNSBDYXNlcycpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJXZWVrbHkgQ291bnQgKCUgb3IgIykiKSwNCiAgICB1cGRhdGVtZW51cyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB5ID0gMC44LA0KICAgICAgICBidXR0b25zID0gbGlzdCgNCg0KICAgICAgICAgIGxpc3QobWV0aG9kID0gInJlc3R5bGUiLA0KICAgICAgICAgICAgICAgYXJncyA9IGxpc3QoInZpc2libGUiLCBjKHJlcChsaXN0KEZBTFNFLCBUUlVFKSwgMTUpKSksDQogICAgICAgICAgICAgICBsYWJlbCA9ICJQZXJjZW50IENvdW50IiksDQoNCiAgICAgICAgICBsaXN0KG1ldGhvZCA9ICJyZXN0eWxlIiwNCiAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KCJ2aXNpYmxlIiwgYyhyZXAobGlzdChUUlVFLCBGQUxTRSksIDE1KSkpLA0KICAgICAgICAgICAgICAgbGFiZWwgPSAiVG90YWwgQ291bnQiKQ0KICAgICAgICApDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQoNCmZpZw0KYGBgDQoNCg0KDQpgYGB7ciBkYWlseV9wbG90bHksIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fSAgDQoNCnRvcDEwX2RmX3dpZGVfcF9kYWlseSA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIFBfRGFpbHlfQ291bnQsIGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgKSAlPiUNCiAgc3ByZWFkKGtleT1Db3VudHJ5X1JlZ2lvbiwgdmFsdWU9UF9EYWlseV9Db3VudCkNCg0KdG9wMTBfZGZfd2lkZV9kYWlseSA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIERhaWx5X0NvdW50LCBgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCkgJT4lDQogIHNwcmVhZChrZXk9Q291bnRyeV9SZWdpb24sIHZhbHVlPURhaWx5X0NvdW50KQ0KDQoNCnBhbGV0dGUgPC0gZGlzdGluY3RDb2xvclBhbGV0dGUoMjApDQoNCmZpZyA8LSB0b3AxMF9kZl93aWRlX2RhaWx5ICU+JSBwbG90X2x5KCkNCg0KZm9yIChrIGluIDI6bGVuZ3RoKHRvcF8xMF9jb3VudHJpZXMpKSB7DQogIGNvdW50cnlfZGYgPC0gZGF0YS5mcmFtZSh5PXRvcDEwX2RmX3dpZGVfZGFpbHlbW2tdXSwgeD10b3AxMF9kZl93aWRlX2RhaWx5W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPWNvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX2RhaWx5KVtrXSwgdmlzaWJsZSA9IEYsIGNvbG9yID0gcGFsZXR0ZVtrXSkNCiAgDQogIHBfY291bnRyeV9kZiA8LSBkYXRhLmZyYW1lKHk9dG9wMTBfZGZfd2lkZV9wX2RhaWx5W1trXV0sIHg9dG9wMTBfZGZfd2lkZV9wX2RhaWx5W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPXBfY291bnRyeV9kZiwgdHlwZT0ic2NhdHRlciIsIG1vZGU9ImxpbmVzIiwgbmFtZSA9IGNvbG5hbWVzKHRvcDEwX2RmX3dpZGVfcF9kYWlseSlba10sIGNvbG9yID0gcGFsZXR0ZVtrXSkNCn0NCg0KZmlnIDwtIGZpZyAlPiUgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRhaWx5IENvbmZpcm1lZCBDYXNlcyBTaW5jZSBGaXJzdCAyNSBDYXNlcyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlPSdEYXlzIFNpbmNlIEZpcnN0IDI1IENhc2VzJyksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRhaWx5IENvdW50ICglIG9yICMpIiksDQogICAgdXBkYXRlbWVudXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeSA9IDAuOCwNCiAgICAgICAgYnV0dG9ucyA9IGxpc3QoDQoNCiAgICAgICAgICBsaXN0KG1ldGhvZCA9ICJyZXN0eWxlIiwNCiAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KCJ2aXNpYmxlIiwgYyhyZXAobGlzdChGQUxTRSwgVFJVRSksIDE1KSkpLA0KICAgICAgICAgICAgICAgbGFiZWwgPSAiUGVyY2VudCBDb3VudCIpLA0KDQogICAgICAgICAgbGlzdChtZXRob2QgPSAicmVzdHlsZSIsDQogICAgICAgICAgICAgICBhcmdzID0gbGlzdCgidmlzaWJsZSIsIGMocmVwKGxpc3QoVFJVRSwgRkFMU0UpLCAxNSkpKSwNCiAgICAgICAgICAgICAgIGxhYmVsID0gIlRvdGFsIENvdW50IikNCiAgICAgICAgKQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KDQpmaWcNCmBgYA0KDQojIyMgQ09WSUQxOSBDYXNlcyBTcHJlYWQgVGltZWxhcHNlDQoNClRoZSB0aW1lLWxhcHNlIHdhcyBwcm9kdWNlZCB0aHJvdWdoIGdnYW5pbWF0ZSBhbmQgc2hvd3MgdGhlIHNwcmVhZCBvZiB0aGUgdmlydXMgc2luY2UgMjJKYW4yMDIwLiBUaGUgdGltZS1sYXBzZSBjeWNsZXMgdGhyb3VnaCB0aGUgZGF0ZXMsIHNob3dpbmcgdGhlIGNvbG9yIGNvZGVkIGluY3JlYXNlIG9mIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBhbmQgZGVhdGggY2FzZXMgYWNyb3NzIHRoZSB3b3JsZC4NCg0KYGBge3IgdGltZWxhcHNfY2FzZXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgaW5jbHVkZT1GQUxTRX0NCnAgPC0gZ2dwbG90KCkgKw0KICBib3JkZXJzKCJ3b3JsZCIsIGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAiZ3JheTg1IikgKw0KICBjb29yZF9tYXAoeGxpbSA9IGMoLTE4MCwgMTgwKSwgeWxpbSA9IGMoLTU1LCA3MCkpICsNCiAgdGhlbWVfbWFwKCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY3YsIERhdGU8PWxhdGVzdF9kYXRlKSwgYWVzKHggPSBMb25nLCB5ID0gTGF0LCBzaXplID0gbG9nMihDb3VudCksIGNvbG9yID0gU3RhdHVzKSwgYWxwaGEgPSAwLjI1KSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMTUpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIpKSArDQogIGxhYnModGl0bGUgPSAiQ09WSUQxOSBMb2cgQ291bnQgb2YgQ2FzZXMgKERhdGU6IHtmcmFtZV90aW1lfSkiLCBzaXplID0gIkxvZyhDYXNlcykiKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9MjUsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNywgZmFjZSA9ICJib2xkIikNCiAgKSArDQogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSA1KSksIHNpemUgPSAibm9uZSIpICsNCiAgdHJhbnNpdGlvbl90aW1lKERhdGUpICsNCiAgZW50ZXJfZmFkZSgpICsNCiAgZXhpdF9mYWRlKCkgKw0KICBlYXNlX2FlcygibGluZWFyIikNCg0KZGF5cyA9IGFzLm51bWVyaWMobGF0ZXN0X2RhdGUgLSBhcy5EYXRlKCIyMDIwLTAxLTIyIikpDQoNCmFuaW1fc2F2ZSgiY292aWQxOV90aW1lbGFwc2UuZ2lmIiwgcCwgaGVpZ2h0ID0gNjAwLCB3aWR0aCA9IDEwMDAsIGZwcyA9IDEwLCBuZnJhbWVzID0gZGF5cyoyLCBlbmRfcGF1c2UgPSAzMCkNCmBgYA0KIVtdKGNvdmlkMTlfdGltZWxhcHNlLmdpZikNCg0KIyMjIE5ldyBDYXNlcyBvZiB0aGUgRGF5IChgciBsYXRlc3RfZGF0ZWApDQoNClRoZSAnTmV3IENhc2VzIG9mIHRoZSBEYXknIG1hcCBkaXNwbGF5cyBhbGwgY29uZmlybWVkIGNhc2VzIG9mIHRoZSBzcGVjaWZpZWQgZGF0ZS4gVGhlIG1hcCB3YXMgcHJvZHVjZWQgdGhyb3VnaCBMZWFmbGV0IGFuZCBwcm92aWRlcyBhIGRldGFpbGVkIGFuZCBpbnRlcmFjdGl2ZSBtYXAgdGhhdCBzaG93cyB0aGUgbG9jYXRpb24gYW5kIG51bWJlciBvZiBjYXNlcyBvZiB0aGUgZGF5Lg0KDQpBbHNvLCB0byBkaWZmZXJlbnRpYXRlIGlmIHRoZSBjYXNlIG9mIHRoZSBkYXkgaXMgdGhlIGZpcnN0IGNhc2UgaW4gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiwgaXQgaXMgaGlnaGxpZ2h0ZWQgcmVkLiBBbGwgdGhlIHNwZWNpZmllZCBwb2ludHMgb24gdGhlIG1hcCBhcmUgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdywgaW5jbHVkaW5nIGN1bXVsYXRpdmUgY291bnQgb2YgZWFjaCBsb2NhdGlvbi4NCg0KDQpgYGB7ciBkYXlfbGVhZmx5X3Bsb3QsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpmaXJzdF9jb2xvciA8LSBjb2xvckZhY3RvcihwYWxldHRlID0gYygicmVkIiwgImJsdWUiKSwgbGV2ZWxzID0gYyhUUlVFLCBGQUxTRSkpDQoNCm5ld19kYXlfbGFiZWxzIDwtIGZ1bmN0aW9uKGRmKSB7DQogIGxhYnMgPC0gbGFwcGx5KHNlcShucm93KGRmKSksIGZ1bmN0aW9uKGkpIHsNCiAgICBwYXN0ZTAoDQogICAgICAiQ291bnRyeTogIiwgZGZbaSwgIkNvdW50cnlfUmVnaW9uIl0sICI8YnI+ICIsDQogICAgICAiUHJvdmluY2U6ICIsIGRmW2ksICJQcm92aW5jZV9TdGF0ZSJdLCAiPGJyPiIsDQogICAgICAiRGF5IENvdW50OiAiLCBkZltpLCAiRGFpbHlfQ291bnQiXSwgIjxicj4iLA0KICAgICAgIkZpcnN0IENhc2U6ICIsIGRmW2ksICJGaXJzdF9DYXNlIl0sICI8YnI+IiwNCiAgICAgICJEYXRlOiAiLCBkZltpLCAiRGF0ZSJdDQogICAgKQ0KICB9KQ0KfQ0KDQpsZWFmbGV0KGRhdGEgPSBuZXdfY2FzZXNfZGF5LCB3aWR0aCA9ICIxMDAlIikgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgbGF0ID0gfkxhdCwNCiAgICBsbmcgPSB+TG9uZywNCiAgICByYWRpdXMgPSB+IGxvZyhDb3VudCkgLyAxLjI1LA0KICAgIGxhYmVsID0gbGFwcGx5KG5ld19kYXlfbGFiZWxzKG5ld19jYXNlc19kYXkpLCBodG1sdG9vbHM6OkhUTUwpLA0KICAgIGNvbG9yID0gfiBmaXJzdF9jb2xvcihGaXJzdF9DYXNlKQ0KICApICU+JQ0KICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwNCiAgICBwYWwgPSBmaXJzdF9jb2xvciwgdmFsdWVzID0gfkZpcnN0X0Nhc2UsDQogICAgdGl0bGUgPSAiRmlyc3QgQ2FzZSAoRGF5KSIsDQogICAgb3BhY2l0eSA9IDAuNzUNCiAgKQ0KYGBgDQoNCmBgYHtyIGRheV90YWJsZV9uZXcsIGVjaG89RkFMU0V9DQpkZl9uZXdfY2FzZXNfZGF5IDwtIG5ld19jYXNlc19kYXkgJT4lDQogIHNlbGVjdCgNCiAgICBEYXRlLCBDb3VudHJ5X1JlZ2lvbiwgUHJvdmluY2VfU3RhdGUsDQogICAgQ291bnQsIERhaWx5X0NvdW50LCBXZWVrbHlfQ291bnQsIEZpcnN0X0Nhc2UNCiAgKQ0KZGZfbmV3X2Nhc2VzX2RheQ0KYGBgDQoNCiMjIyBOZXcgQ2FzZXMgb2YgdGhlIFdlZWsgKGByIGxhdGVzdF9kYXRlYCkNCg0KVGhlICdOZXcgQ2FzZXMgb2YgdGhlIFdlZWsnIG1hcCBkaXNwbGF5cyBhbGwgY29uZmlybWVkIGNhc2VzIG9mIHRoZSB3ZWVrIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBkYXRlLiBUaGlzIG1hcCBzaG93cyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgZGFpbHkgY2FzZXMgbWFwIGJ1dCBpbmNsdWRlcyBhbGwgY2FzZXMgaW4gdGhlIHBhc3Qgd2Vlay4NCg0KYGBge3Igd2Vla19sZWFmbHlfcGxvdCwgZWNobz1GQUxTRX0NCmZpcnN0X2NvbG9yIDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBjKCJyZWQiLCAiYmx1ZSIpLCBsZXZlbHMgPSBjKFRSVUUsIEZBTFNFKSkNCg0KbmV3X3dlZWtfbGFiZWxzIDwtIGZ1bmN0aW9uKGRmKSB7DQogIGxhYnMgPC0gbGFwcGx5KHNlcShucm93KGRmKSksIGZ1bmN0aW9uKGkpIHsNCiAgICBwYXN0ZTAoDQogICAgICAiQ291bnRyeTogIiwgZGZbaSwgIkNvdW50cnlfUmVnaW9uIl0sICI8YnI+ICIsDQogICAgICAiUHJvdmluY2U6ICIsIGRmW2ksICJQcm92aW5jZV9TdGF0ZSJdLCAiPGJyPiIsDQogICAgICAiV2VlayBDb3VudDogIiwgZGZbaSwgIldlZWtseV9Db3VudCJdLCAiPGJyPiIsDQogICAgICAiRmlyc3QgQ2FzZTogIiwgZGZbaSwgIkZpcnN0X0Nhc2UiXSwgIjxicj4iLA0KICAgICAgIkRhdGU6ICIsIGRmW2ksICJEYXRlIl0NCiAgICApDQogIH0pDQp9DQoNCmxlYWZsZXQoZGF0YSA9IG5ld19jYXNlc193ZWVrLCB3aWR0aCA9ICIxMDAlIikgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgbGF0ID0gfkxhdCwNCiAgICBsbmcgPSB+TG9uZywNCiAgICByYWRpdXMgPSB+IGxvZyhDb3VudCkgLyAxLjI1LA0KICAgIGxhYmVsID0gbGFwcGx5KG5ld193ZWVrX2xhYmVscyhuZXdfY2FzZXNfd2VlayksIGh0bWx0b29sczo6SFRNTCksDQogICAgY29sb3IgPSB+IGZpcnN0X2NvbG9yKEZpcnN0X0Nhc2UpDQogICkgJT4lDQogIGFkZExlZ2VuZCgiYm90dG9tcmlnaHQiLA0KICAgIHBhbCA9IGZpcnN0X2NvbG9yLCB2YWx1ZXMgPSB+Rmlyc3RfQ2FzZSwNCiAgICB0aXRsZSA9ICJGaXJzdCBDYXNlIChXZWVrKSIsDQogICAgb3BhY2l0eSA9IDAuNzUNCiAgKQ0KYGBgDQoNCmBgYHtyIHdlZWtfdGFibGVfbmV3LCBlY2hvPUZBTFNFfQ0KZGZfbmV3X2Nhc2VzX3dlZWsgPC0gbmV3X2Nhc2VzX3dlZWsgJT4lDQogIHNlbGVjdCgNCiAgICBEYXRlLCBDb3VudHJ5X1JlZ2lvbiwgUHJvdmluY2VfU3RhdGUsDQogICAgQ291bnQsIERhaWx5X0NvdW50LCBXZWVrbHlfQ291bnQsIEZpcnN0X0Nhc2UNCiAgKQ0KZGZfbmV3X2Nhc2VzX3dlZWsNCmBgYA0KDQpgYGB7ciBjYXNlc19jb3VudF9wZXJjZW50X2FnZywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpwZXJjZW50X2NvdW50IDwtIGN2X21lcmdlICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgZmlsdGVyKERhdGUgPD0gbGF0ZXN0X2RhdGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCwgbmEucm0gPSBUUlVFKSwNCiAgICBEZWFkID0gc3VtKERlYWQsIG5hLnJtID0gVFJVRSksDQogICAgUmVjb3ZlcmVkID0gc3VtKFJlY292ZXJlZCwgbmEucm0gPSBUUlVFKQ0KICApDQpmb3IgKHggaW4gc2VxKDEsIG5yb3cocGVyY2VudF9jb3VudCkpKSB7DQogIGlmICh4ID09IDEpIHsNCiAgICBwZXJjZW50X2NvdW50JERhaWx5X0NvbmZpcm1lZFt4XSA8LSBwZXJjZW50X2NvdW50JENvbmZpcm1lZFt4XQ0KICAgIHBlcmNlbnRfY291bnQkRGFpbHlfRGVhZFt4XSA8LSBwZXJjZW50X2NvdW50JERlYWRbeF0NCiAgICBwZXJjZW50X2NvdW50JERhaWx5X1JlY292ZXJlZFt4XSA8LSBwZXJjZW50X2NvdW50JFJlY292ZXJlZFt4XQ0KICB9DQogIGVsc2Ugew0KICAgIHBlcmNlbnRfY291bnQkRGFpbHlfQ29uZmlybWVkW3hdIDwtIHBlcmNlbnRfY291bnQkQ29uZmlybWVkW3hdIC0gcGVyY2VudF9jb3VudCRDb25maXJtZWRbeCAtIDFdDQogICAgcGVyY2VudF9jb3VudCREYWlseV9EZWFkW3hdIDwtIHBlcmNlbnRfY291bnQkRGVhZFt4XSAtIHBlcmNlbnRfY291bnQkRGVhZFt4IC0gMV0NCiAgICBwZXJjZW50X2NvdW50JERhaWx5X1JlY292ZXJlZFt4XSA8LSBwZXJjZW50X2NvdW50JFJlY292ZXJlZFt4XSAtIHBlcmNlbnRfY291bnQkUmVjb3ZlcmVkW3ggLSAxXQ0KICB9DQp9DQoNCmRlYWRfY29uZl9yZWN2IDwtIHBlcmNlbnRfY291bnQgJT4lDQogIHNlbGVjdChEYXRlLCBDb25maXJtZWQsIERlYWQsIFJlY292ZXJlZCkgJT4lDQogIGdhdGhlcihrZXk9IlN0YXR1cyIsIHZhbHVlPSJDb3VudCIsIC1EYXRlKQ0KDQpkZWFkX2NvbmZfcmVjdl9kYWlseSA8LSBwZXJjZW50X2NvdW50ICU+JQ0KICBzZWxlY3QoRGF0ZSwgRGFpbHlfQ29uZmlybWVkLCBEYWlseV9EZWFkLCBEYWlseV9SZWNvdmVyZWQpICU+JQ0KICBnYXRoZXIoa2V5PSJEYWlseSIsIHZhbHVlPSJDb3VudCIsIC1EYXRlKQ0KDQpwZXJjZW50X2NvdW50JFBlcmNlbnRfRGVhZCA8LSBwZXJjZW50X2NvdW50JERlYWQgLyBwZXJjZW50X2NvdW50JENvbmZpcm1lZA0KDQpwZXJjZW50X2NvdW50JFBlcmNlbnRfUmVjb3ZlcmVkIDwtIHBlcmNlbnRfY291bnQkUmVjb3ZlcmVkIC8gcGVyY2VudF9jb3VudCRDb25maXJtZWQNCg0KcGVyY2VudF9vcmcgPC0gcGVyY2VudF9jb3VudCAlPiUNCiAgc2VsZWN0KERhdGUsIFBlcmNlbnRfUmVjb3ZlcmVkLCBQZXJjZW50X0RlYWQpICU+JQ0KICBnYXRoZXIoa2V5PSJTdGF0dXMiLCB2YWx1ZT0iUGVyY2VudCIsIC1EYXRlKSANCmBgYA0KDQojIyMgR2VuZXJhbCBUcmVuZHMNCg0KVGhlIHBsb3RzIGJlbG93IG91dGxpbmVzIGdlbmVyYWwgdHJlbmRzIHNlZW4gb2YgdGhlIHZpcnVzIG92ZXIgdGltZToNCg0KKDEpCeKAnFBlcmNlbnQgb2YgQ2FzZXMgUmVjb3ZlcmVkIG9yIERlYWQgcGVyIERheeKAnTogdGhlIHRvdGFsIHBlcmNlbnQgb2YgY2FzZXMgdGhhdCBoYXZlIHJlc3VsdGVkIGluIHJlY292ZXJ5IG9yIGRlYXRoIHBlciBjb25maXJtZWQgY2FzZQ0KDQooMikJIkN1bXVsYXRpdmUgU3RhdHVzIG9mIEFsbCBDYXNlcyI6IHRoZSBjb250aW51b3VzIGluY3JlYXNlIG9mIGNvbmZpcm1lZCwgZGVhdGgsIGFuZCByZWNvdmVyZWQgY2FzZXMgb3ZlciB0aW1lIA0KDQooMykJ4oCcU3RhdHVzIG9mIENhc2VzIHBlciBEYXnigJ06IHRoZSBudW1iZXIgb2YgY2FzZXMgY2xhc3NpZmllZCBhcyBjb25maXJtZWQsIGRlYXRoLCBvciByZWNvdmVyZWQgc3VidHJhY3RlZCB0byBzaG93IHBlciBkYXkgY2hhbmdlcw0KDQpgYGB7ciBwbG90X3BlcmNlbnRfY2FzZXMsIGVjaG89RkFMU0UsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTQuNX0NCmdncGxvdChwZXJjZW50X29yZywgYWVzKHggPSBEYXRlLCB5PVBlcmNlbnQsIGdyb3VwPVN0YXR1cykpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFN0YXR1cyksIHNpemU9MS4zKSArDQogIGdndGl0bGUoIlBlcmNlbnQgb2YgQ2FzZXMgUmVjb3ZlcmVkIG9yIERlYWQgcGVyIERheSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInJlZDMiLCAiZ3JlZW4zIikpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjcgZGF5IiwgDQogICAgICAgICAgICAgICBkYXRlX21pbm9yX2JyZWFrcyA9ICI3IGRheSIsIA0KICAgICAgICAgICAgICAgZGF0ZV9sYWJlbHMgPSAiJWIgJWQiKSArDQogIHRoZW1lX2xpZ2h0KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7ciBwbG90X2N1bXVsYXRpdmVfc3RhdHVzLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00LjV9DQpnZ3Bsb3QoZGVhZF9jb25mX3JlY3YsIGFlcyh4ID0gRGF0ZSwgeT1Db3VudCwgZ3JvdXA9U3RhdHVzKSkgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gU3RhdHVzKSwgc2l6ZT0xLjMpICsNCiAgZ2d0aXRsZSgiQ3VtdWxhdGl2ZSBTdGF0dXMgb2YgQWxsIENhc2VzIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZTMiLCAicmVkMyIsICJncmVlbjMiKSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiNyBkYXkiLCANCiAgICAgICAgICAgICAgIGRhdGVfbWlub3JfYnJlYWtzID0gIjcgZGF5IiwgDQogICAgICAgICAgICAgICBkYXRlX2xhYmVscyA9ICIlYiAlZCIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg0KYGBge3IgcGxvdF9zdGF0dXNfcGVyX2RheSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NC41fSAgDQpnZ3Bsb3QoZGVhZF9jb25mX3JlY3ZfZGFpbHksIGFlcyh4ID0gRGF0ZSwgeT1Db3VudCwgZ3JvdXA9RGFpbHkpKSArDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBEYWlseSksIHNpemU9MS4zKSArDQogIGdndGl0bGUoIlN0YXR1cyBvZiBDYXNlcyBwZXIgRGF5IikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZTMiLCAicmVkMyIsICJncmVlbjMiKSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiNyBkYXkiLCANCiAgICAgICAgICAgICAgIGRhdGVfbWlub3JfYnJlYWtzID0gIjcgZGF5IiwgDQogICAgICAgICAgICAgICBkYXRlX2xhYmVscyA9ICIlYiAlZCIpKw0KICB0aGVtZV9saWdodCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3IgZ2l0aHViX3B1c2hpbmdfY29tbWFuZHMsIGluY2x1ZGU9RkFMU0V9DQpnaXRzdGF0dXMgPC0gZnVuY3Rpb24oZGlyID0gZ2V0d2QoKSkgew0KICBjbWRfbGlzdCA8LSBsaXN0KA0KICAgIGNtZDEgPSB0b2xvd2VyKHN1YnN0cihkaXIsIDEsIDIpKSwNCiAgICBjbWQyID0gcGFzdGUoImNkIiwgZGlyKSwNCiAgICBjbWQzID0gImdpdCBzdGF0dXMiDQogICkNCiAgY21kIDwtIHBhc3RlKHVubGlzdChjbWRfbGlzdCksIGNvbGxhcHNlID0gIiAmICIpDQogIHNoZWxsKGNtZCkNCn0NCg0KZ2l0YWRkIDwtIGZ1bmN0aW9uKGRpciA9IGdldHdkKCkpIHsNCiAgY21kX2xpc3QgPC0gbGlzdCgNCiAgICBjbWQxID0gdG9sb3dlcihzdWJzdHIoZGlyLCAxLCAyKSksDQogICAgY21kMiA9IHBhc3RlKCJjZCIsIGRpciksDQogICAgY21kMyA9ICJnaXQgYWRkIC0tYWxsIg0KICApDQogIGNtZCA8LSBwYXN0ZSh1bmxpc3QoY21kX2xpc3QpLCBjb2xsYXBzZSA9ICIgJiAiKQ0KICBzaGVsbChjbWQpDQp9DQoNCmdpdGNvbW1pdCA8LSBmdW5jdGlvbihtc2cgPSBwYXN0ZSgiY2hvcmU6IGF1dG8tdXBkYXRlIiwgU3lzLnRpbWUoKSwgImVzdCIpLCBkaXIgPSBnZXR3ZCgpKSB7DQogIGNtZCA8LSBzcHJpbnRmKCJnaXQgY29tbWl0IC1tXCIlc1wiIiwgbXNnKQ0KICBzeXN0ZW0oY21kKQ0KfQ0KDQpnaXRwdXNoIDwtIGZ1bmN0aW9uKGRpciA9IGdldHdkKCkpIHsNCiAgY21kX2xpc3QgPC0gbGlzdCgNCiAgICBjbWQxID0gdG9sb3dlcihzdWJzdHIoZGlyLCAxLCAyKSksDQogICAgY21kMiA9IHBhc3RlKCJjZCIsIGRpciksDQogICAgY21kMyA9ICJnaXQgcHVzaCINCiAgKQ0KICBjbWQgPC0gcGFzdGUodW5saXN0KGNtZF9saXN0KSwgY29sbGFwc2UgPSAiICYgIikNCiAgc2hlbGwoY21kKQ0KfQ0KDQpnaXQycjo6Y29uZmlnKHVzZXIubmFtZSA9ICJhbGJlY2hlbiIsIHVzZXIuZW1haWwgPSAiYWxjaGVuMjQ0QGdtYWlsLmNvbSIpDQpgYGANCg0KYGBge3Igc2F2ZV9kb2MsIGluY2x1ZGU9RkFMU0V9DQpkb2N1bWVudFNhdmUoZ2V0QWN0aXZlRG9jdW1lbnRDb250ZXh0KCkpDQpTeXMuc2xlZXAoMjApDQpgYGANCg0KYGBge3IgZ2l0aHViX3B1c2hfYWxsLCBpbmNsdWRlPUZBTFNFfQ0KZ2l0c3RhdHVzKCkNCmdpdGFkZCgpDQpnaXRjb21taXQoKQ0KZ2l0cHVzaCgpDQpgYGANCg==